www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MeterZJ.cpp

    // MeterZJ.cpp: implementation of the CMeterZJ class.
//
//////////////////////////////////////////////////////////////////////

#include "MeterZJ.h"
#include "MPZJ.h"
#include "MPTran.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMeterZJ::CMeterZJ()
{
	pMPBase = new CMPTran();
}
CMeterZJ::CMeterZJ( METERPARA meter)
{
	pMPBase = new CMPTran();
	memcpy(&m_meter,&meter,sizeof(METERPARA));
	m_meter.com_para.addr[1] = m_meter.type ;
}

CMeterZJ::~CMeterZJ()
{

}
int CMeterZJ::OnReadAllItems(int m_mask)
{
        int i;
//        time_t m_time,m_time1;
//        time( &m_time );
	if(m_mask & 0x01)
	{
		i = OnReadEnergy( );
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d电量数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d电量数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
		
	}
	if(m_mask & 0x02)
	{
		i = OnReadPVC();
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d瞬时量数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d瞬时量数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
	}
	if(m_mask & 0x04)
	{
		i = OnReadMD( );
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d需量数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d需量数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
	}
	if(m_mask & 0x08 == 0x08)
	{
		i = OnReadEvent();
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d电表事件数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d电表事件数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
}

//	printf("\r\nmask:%02x",m_mask);
	if((m_mask & 0x10) == 0x10)
	{
		i = OnReadOther();
#ifdef DBUG_PRO
		if( i == 0)
		{
			printf("\r\n采集电表%d其他数据 ---- OK!!!",m_meter.No);
		}
		else
		{
			printf("\r\n采集电表%d其他数据 ---- FALL!!!",m_meter.No);
		}
		
#endif
	}
//	printf("\r\n USED TIME %d",m_time1 - m_time);	
	return 0;
}

	
int CMeterZJ::OnReadPVC()
{
	BYTE err = 0;
	int Item[4] = {0xB63F,0xB64F,0xB61F,0xB62F};	
		
	for(int i = 0; i < 4 ;i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
        }


	return err;
}

int CMeterZJ::OnReadEnergy( )
{
	BYTE err = 0;
	int Item[ 2 ] = {0x901F,0x902F};//对应浙江用电协议的类别
		
	for(int i = 0; i < 2 ;i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
        }

	return err;
}



int CMeterZJ::OnReadEvent()
{
	BYTE err = 0;
/*	int Item[ 2 ] = {0x110,0x120};//对应浙江用电协议的类别
	int Item_G[2] = {0x901F,0x902F};
		
	for(int i = 0; i < 2 ;i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i],RETRYNUM))
		{
			err |= 0x01;
		}
        }
*/	return err;
}

int CMeterZJ::OnReadOther()
{
	BYTE err = 0;
	int Item[ 1 ] = {0xC33F};//对应浙江用电协议的类别
		
	for(int i = 0; i < 1 ;i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
        }
	return err;
}
int CMeterZJ::OnReadMD( )
{
	BYTE err = 0;
	int Item[ 4 ] = {0xA01F,0xA02F,0xB01F,0xB02F};//对应浙江用电协议的类别

	for(int i = 0; i < 4 ;i++)
	{
		err <<= 1;
		if(!ReadItem( Item[i], RETRYNUM))
		{
			err |= 0x01;
		}
        }
	return err;
}

bool CMeterZJ:: ReadItem( int Item, int RetryCount)
{
	bool Values = false;
	int FrmLen,RecvLen;
	BYTE tmp_buf[256];
	FrmLen = pMPBase->FormReadDataFrame(OutFram, Item, m_meter.com_para.addr);
	if(FrmLen == 0) 
	{
		printf("\r\n组织命令数据失败!!!!");
		return Values;
	}
	int j = 0xFFFF, i;
	for(i = 0; i < RetryCount; i++)
	{
		if( !OnOpenCom() )
		{
		     continue;//串行口打开失败
		}

		Write(OutFram,FrmLen);	//发送帧
		if ( !WaitForReponse(TIME_SEC) ) //等待回应帧
		{
			OnCloseCom();
			continue;
		}
		RecvLen = Read(tmp_buf,sizeof(tmp_buf) );		//读取帧
		OnCloseCom();
		DataLen = 0;
                j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,Item,DataFrame,DataLen,m_meter.com_para.addr);
		if ( j == 0)//解析帧
		{
			if(DataLen > 0)
			      pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,0,DataLen);
			else
			      pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,1,DataLen);
			Values = true;
			return true;
		}
	}
	if( i >= RetryCount && j == 0xFFFF)
	{
		pShmMan->SaveDataToShm(DataFrame, m_meter.No, Item,2,DataLen);		
	}
	return Values;
}

//bool CMeterGB::GetData(BYTE *data, int &dataLen, int item)
//{
//
//}